#include "duktape.h"
#include "fsdep.h"
#include "utils.h"
#include "log.h"
#include "keypad.h"

// #define EJS_DEBUG

#ifdef EJS_DEBUG
#define INIT_MODULE(name) {void name##_init(duk_context* ctx); debugf(#name"_init");name##_init(ctx);}
#else
#define INIT_MODULE(name) {void name##_init(duk_context* ctx);name##_init(ctx);}
#endif
static int init_module(duk_context* ctx){
    // INIT_MODULE(debugger);
    INIT_MODULE(iot);
    INIT_MODULE(ringbuffer);
    INIT_MODULE(pwd);
    INIT_MODULE(os);
    INIT_MODULE(tts);
    INIT_MODULE(audio);
    INIT_MODULE(network);
    INIT_MODULE(udp);   
    INIT_MODULE(misc);
    INIT_MODULE(fs);
    INIT_MODULE(uart);
    INIT_MODULE(g711a);
    INIT_MODULE(gpio);
    INIT_MODULE(keypad); 
    INIT_MODULE(md5);
}
extern duk_ret_t native_print(duk_context *ctx);
extern duk_ret_t native_set_timeout(duk_context* ctx);
extern duk_ret_t native_clearTimeout(duk_context* ctx);
int eval_file(duk_context *ctx,const char* filename);
int load_init(duk_context* ctx);



int duktape_init(duk_context* ctx){
    if(load_init(ctx)){
        debugf("port load init failed");
        return -2;
    }
    // eval_file(ctx,"/js/lib/iot.js");
    duk_peval_lstring_noresult(ctx,js_lib_iot_min_js,sizeof(js_lib_iot_min_js));

    duk_push_c_function(ctx, native_print, 1 /*nargs*/);
    duk_put_global_string(ctx, "print");

    duk_push_c_function(ctx, native_set_timeout, 2 /*nargs*/);
    duk_put_global_string(ctx, "setTimeout");

    duk_push_c_function(ctx, native_clearTimeout, 2 /*nargs*/);
    duk_put_global_string(ctx, "clearTimeout");
    init_module(ctx);
    return 0;
}

#ifdef EJS_DEBUG
#define UNINIT_MODULE(name) {void name##_uninit(duk_context* ctx); debugf(#name"_uninit");name##_uninit(ctx);}
#else
#define UNINIT_MODULE(name) {void name##_uninit(duk_context* ctx);name##_uninit(ctx);}
#endif

void duktape_uninit(duk_context* ctx){
    if(ctx){
        UNINIT_MODULE(keypad);
        duk_destroy_heap(ctx);
    }
}
